//: C24:RTTIwithExceptions.cpp
// From Thinking in C++, 2nd Edition
// Available at http://www.BruceEckel.com
// (c) Bruce Eckel 1999
// Copyright notice in Copyright.txt
#include <typeinfo>
#include <iostream>
using namespace std;
class X
{
public:
    virtual ~X() {} };
class B
{
public:
    virtual ~B() {} };
class D : public B {};

int main()
{
    D d;
    B & b = d; // Upcast to reference
    try {
        X& xr = dynamic_cast<X&>(b);
    } catch (...) {
        cout << "dynamic_cast<X&>(b) failed"
             << endl;
    }
    X* xp = 0;
    try {
        typeid(*xp); // Throws exception
    } catch (bad_typeid) {
        cout << "Bad typeid() expression" << endl;
    }
} ///:~
